package cn.hyh;

import java.util.function.BiConsumer;
import java.util.function.Consumer;

/**
 * lambda表达式工具类
 *
 * @author hyh
 * 2020/5/29
 */
public class LambdaUtil {

    /**
     * foreach循环可以包含index
     *
     * @param consumer 合集
     * @param <T>      泛型
     * @return 返回对象和索引
     */
    public static <T> Consumer<T> consumerWithIndex(BiConsumer<T, Integer> consumer) {
        /**
         * 计数类
         */
        class Obj {
            int i;
        }
        Obj obj = new Obj();
        return t -> {
            int index = obj.i++;
            consumer.accept(t, index);
        };
    }

    /**
     * lambda表达式异常封装
     * @param consumer 消费者
     * @param eClass 异常类Class
     * @param <T> 消费者类型
     * @param <E> 异常
     * @return 可以处理异常的消费者
     */
    public static <T, E extends Exception> Consumer<T> consumerWrapper(Consumer<T> consumer, Class<E> eClass) {
        return i -> {
            try {
                consumer.accept(i);
            } catch (Exception e) {
                try {
                    E eCast = eClass.cast(e);
                    // 后续异常处理
                    eCast.printStackTrace();
                } catch (ClassCastException castException) {
                    throw e;
                }
            }
        };
    }

}
